#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"

//时间
unsigned int IR_Time=0;
//状态
unsigned char IR_State=0;
//数据
unsigned char IR_Data[4]={0};
//指向数据位置
unsigned char TR_pData=0;
//判断是否收到数据1为收到
unsigned char IR_DataFlag=0;
//是否重发
unsigned char IR_RepeatFlag=0;
//地址码
unsigned char IR_Address=0;
//命令码
unsigned char IR_Command=0;
//初始化计时器和外部中断
void IR_INit(void)
{
	Timer0_Init();
	Int0_Init();
}

//获取是否收到标志位
unsigned char IR_GetDataFlag(void)
{
	
	if(IR_DataFlag)
	{
		IR_DataFlag=0;
		//接收成功
		return 1;
	}
	//未接收到
	return 0;
}
//获取是否重发
unsigned char IR_GetRepeatFlag(void)
{
	if(IR_RepeatFlag)
	{
		IR_RepeatFlag=0;
		//重发
		return 1;
	}
	//无重发
	return 0;
}

//返回地址码
unsigned char IR_GetAddress(void)
{
	return IR_Address;
}

//返回命令码
unsigned char IR_GetCommand(void)
{
	return IR_Command;
}


//外部中断0
void Int0_Routine(void)   interrupt 0
{
	//状态判断
	if(IR_State==0)
	{
		//设置计时起点
		Timer0_SetCounter(0);
		//开始计时
		Timer0_Run(1);
		IR_State=1;
	}
	else if(IR_State==1)
	{
		//读取时间
		IR_Time=Timer0_GetCounter();
		//计时清零
		Timer0_SetCounter(0);
		//13500为13500微秒12MHZ的晶振计时加1就是1纳秒
		//因为现在板子时11.0592MHZ的晶振因此需要/1.085以匹配时间
		//下面同理
		if(IR_Time>((13500-500)/1.085)&&IR_Time<((13500+500)/1.085))
		{
			//设置状态开始接收
			IR_State=2;
		}
		else if(IR_Time>((11250-500)/1.085)&&IR_Time<((11250+500)/1.085))
		{
			//接收到信息
			IR_RepeatFlag=1;
			//停止计时
			Timer0_Run(0);
			//回到初始状态
			IR_State=0;
		}
		else
		{
			//出现意外情况
			//状态不变
			IR_State=1;
		}
	}
	else if(IR_State==2)
	{
		//读取时间
		IR_Time=Timer0_GetCounter();
		//计时清零
		Timer0_SetCounter(0);
		if(IR_Time>((1120-500)/1.085)&&IR_Time<((1120+500)/1.085))
		{
			//0
			//0,0,1111 1110 0000 0000 0000 0000
			//1
			//1,1,0000 0010/1111 1101/0000 0000 
			
			IR_Data[TR_pData/8]&=~(0x01<<(TR_pData%8));
			TR_pData++;
		}
		else if(IR_Time>((2250-500)/1.085)&&IR_Time<((2250+500)/1.085))
		{
			IR_Data[TR_pData/8]|=(0x01<<(TR_pData%8));
			TR_pData++;
		}
		else
		{
			//错误情况
			//置0放弃这次的数据
			TR_pData=0;
			//设置状态等待下一次
			IR_State=1;
		}
		if(TR_pData>=32)
		{
			TR_pData=0;
			//验证收到的内容是否正确
			//第0位为地址码
			//第1位为地址反码
			//第2位为命令码
			//第3位为命令反码
			if(IR_Data[0]==~IR_Data[1]&&IR_Data[2]==~IR_Data[3])
			{
				//收到数据
				IR_DataFlag=1;
				//转存地址码
				IR_Address=IR_Data[0];
				//转存命令码
				IR_Command=IR_Data[2];
			}
			//接收数据结束返回0状态
			IR_State=0;
			Timer0_SetCounter(0);
		}
	}
}






